Категорії
FreeBSD OpenBSD Windows

[pf] Авторизация на базе authpf

Что же это такое? Это очень удобный механизм предоставления доступа после авторизации по ssh. Чем-то напоминает port knoking. Идея заключается в следующем: пользователь авторизируется через ssh (можно использовать пароль, но ключи удобнее) и после успешной авторизации запускаются соответствующие правила файервола pf. В них-то можно указать разрешения или нужные пробросы.

Тестовый стенд: OpenBSD 5.0/FreeBSD8.2 (server), FreeBSD 8.2 (client), Windows XP (client)

1) Подготовка

Создадим новый класс

# vi /etc/login.conf
authpf:\
	:shell=/usr/sbin/authpf:\
	:tc=default:

и обновим хэшированную базу данных /etc/login.conf.db:

#cap_mkdb /etc/login.conf

В него будем помещать наших authpf юзеров

2) Настройка authpf.

Для минимальной работоспособности нам потребуется создать пустой файл

#echo -n > /etc/authpf/authpf.conf

и подготовить текст приветствия:

echo 'Welcome to organization' > /etc/authpf/authpf.message

Создаем нового пользователя, который принадлежит классу authpf, входит в группу authpf и в качестве оболочки получает /usr/sbin/authpf:

#useradd -m -c 'authpf user' -g authpf -L authpf -s /usr/sbin/authpf testuser

далее можно либо назначить юзеру пароль, либо использовать ключи.

Для каждого пользователя нужно создать отдельно папку и файл с правилами:

#mkdir -p /etc/authpf/users/testuser
#cat /etc/authpf/users/testuser/authpf.rules
ext_if = "fxp0"
nat on $ext_if inet from $user_ip to any -> ($ext_if)

Можно использовать и глобальный файл /etc/authpf/authpf.rules для тех, у кого нет своего пользовательского. При наличии обоих файлов, используется только пользовательский.

Для удобства можна использовать следующие зарезервированіе макросы

  • $user_ip – IP адрес залогиненого пользователя
  • $user_id – имя залогиненого пользователя

Для того, что бы заработал authpf можно использовать следующие соответствующие “якоря” в конфиг pf’a:

nat-anchor "authpf/*"
rdr-anchor "authpf/*"
binat-anchor "authpf/*"
anchor "authpf/*"

Как вариант, можно использовать таблицу с зарезервируемым именем authpf_users для общего правила для всех залогиненых. Ее обязательно нужно добавить в правила:

table <authpf_users> persist
pass in on egress proto tcp from <authpf_users> to port smtp

На этом настройка серверной части в OpenBSD заканчивается, но настройка во FreeBSD продолжается (ввиду кривого портирования pf/authpf из OpenBSD). И так, нам ещё нужно сделать следующее:

– установить такие параметры в /etc/ssh/sshd_config:

ClientAliveInterval 20
ClientAliveCountMax 3

– создать каталог /var/authpf и поставить ему права 0770 и владельца root:authpf В этой папке будут храниться сессии подключенных клиентов

– смонтировать fdescfs (иначе будем получать ошибку pfctl: /dev/fd/4: No such file or directory):

#mount -t fdescfs fdescfs /dev/fd

Дополнительно можно включить логгирование authpf’a. Для этого добавим в /etc/syslog.conf такой код (естественно, что создать соответствующий файл и перегрузить syslog)

!authpf
*.*           -/var/log/authpf.log

3) Клиентское подключение Windows

Для подключения нам потребуется бинарник plink.exe из пакета PuTTy. Вот как нужно его запускать:

c:\putty>plink.exe -pw secret testuser@192.168.1.1
Hello testuser. You are authenticated from host "192.168.1.2"
Welcome to organization

При этом закрывать это окно нельзя!

4) Клиентское подключение FreeBSD

Для подключения можно использовать обычное подключение по ssh. Так же как и в предыдущем примере, закрывать эту сессию нельзя. Но как же быть, ведь, к примеру, нужно настроить сервер что бы он автоматически подключался после ребута? Выход есть: использовать screen (tmux):

#/usr/local/bin/screen -d -m /usr/bin/ssh testuser@192.168.1.1

5) Диагностика.

Что бы посмотреть список активных подключений authpf, вводим такую команду:

# pfctl -a authpf -sA
authpf/testuser(18527)

Посмотрим, какие правила при этом выполнились:

# pfctl -a "authpf/wifi(18527)" -s rules
pass in quick on ral0 inet from 192.168.2.3 to any flags S/SA keep state

# pfctl -a "authpf/wifi(18527)" -s nat
nat on tun0 inet from 192.168.2.3 to any -> (tun0) round-robin
rdr on ral0 inet proto tcp from 192.168.2.3 to any port = ftp -> 127.0.0.1 port 8021

6) ACL

Для контроля пользователей можно использовать директорию /etc/authpf/banned (создается файл с именем запрещенного пользователя) или файл /etc/authpf/authpf.allow (вписіваем список разрешенных или ‘*’ для всех). При отсутствии authpf.allow вход разрешается всем. Важно помнить, что приоритет у banned выше, чем у allow.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Домашняя страничка Andy
Записки молодого админа
Самостоятельная подготовка к Cisco CCNA
Самостоятельная подготовка к Cisco CCNP
Powered by Muff